#ifndef VERTEX_H_
#define VERTEX_H_

#include <string>
#include "util/LinkedList.h"
#include "core/exceptions/DuplicateElementException.h"

/*
 * Clase que representa un vertice del grafo. Tiene un identificador
 * unico y dos coordenadas que lo posicionan (X e Y). Ademas tiene
 * un conjunto de aristas salientes.
 */
class Edge;
class Vertex {
public:

	/*
	 * Constructor. Recibe el id, y las coordenadas de la posicion.
	 * Valores por defecto para las coordenadas son 0.0.
	 */
	Vertex(std::string id);

	/*
	 * Destructor.
	 */
	virtual ~Vertex();

	/*
	 * Compara al vertice con otro. Se iguala por id.
	 */
	virtual bool equals(Vertex* other);

	/*
	 * Getter del id.
	 */
	virtual std::string getId();

//	/*
//	 * Getter de la coordenada X de la posicion.
//	 */
//	virtual double getPositionX();
//	virtual double setPositionX(double x);
//
//	/*
//	 * Getter de la coordenada Y de la posicion.
//	 */
//	virtual double getPositionY();
//	virtual double setPositionY(double y);

	/*
	 * Agrega una arista al conjunto de aristas salientes. Devuleve
	 * al vertice.
	 * Devuelve DuplicateElementException en caso de ya tener la arista.
	 */
	virtual Vertex* addOutgoingEdge(Edge* edge) throw (DuplicateElementException);

	/*
	 * Elimina la arista de su listas de aristas salientes
	 */
	virtual Edge* removeOutgoingEdge(Edge* edge) throw (util::ElementNotFoundException);

	/*
	 * Getter del conjunto de aristas salientes (LinkedList).
	 */
	virtual util::LinkedList<Edge> getOutgoingEdges();

private:
	void setId(std::string id);
	std::string id;
	double position_x;
	double position_y;
	util::LinkedList<Edge> outgoingEdges;
};

#include "Edge.h"

#endif /* VERTEX_H_ */
